package cn.me.alphamq.common.store;

import cn.me.alphamq.common.sync.StopWatch;
import cn.me.alphamq.common.sync.impl.ObjectStopWatch;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 停表的管理者
 *
 * @author f
 */
public class StopWatchManager {

    /**
     * key：消息的唯一 id，value：控制消息监听器的停表
     */
    private static final Map<String, StopWatch> STOP_WATCH_MAP = new ConcurrentHashMap<>();

    /**
     * 返回一个 StopWatch 的实例，用于解耦
     *
     * @return StopWatch 的实例
     */
    public static StopWatch newStopWatch() {
        // TODO 之后可以修改这里的实现，从而能够返回其它类型的停表
        return new ObjectStopWatch();
    }

    /**
     * 获取消息监听器的停表
     *
     * @param msgId 消息的唯一 id
     * @return 消息对应监听器的停表
     */
    public static StopWatch get(String msgId) {
        return STOP_WATCH_MAP.get(msgId);
    }

    /**
     * 唤醒消息监听器，并移除停表
     *
     * @param msgId 消息的唯一 id
     */
    public static void resumeAndRemove(String msgId) {
        STOP_WATCH_MAP.remove(msgId).resume();
    }

    /**
     * 保存一个停表
     *
     * @param msgId     消息的唯一 id
     * @param stopWatch 控制消息监听器的停表
     */
    public static void put(String msgId, StopWatch stopWatch) {
        STOP_WATCH_MAP.put(msgId, stopWatch);
    }

}
